﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TicketsPhone.Web.Models;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Domain.Access;
using TicketsPhone.Web.Utils;

namespace TicketsPhone.Web.Controllers
{
    public class EntidadesController : BaseController, IConsultasSeccion<EntidadFormModel>
    {

        public TipoModulo ModuloActual
        {
            get { return TipoModulo.Entidades; }
        }

        EntidadRepositorio _entidad = new EntidadRepositorio();
        PaisRepositorio _pais = new PaisRepositorio();
        

        public ActionResult Listar()
        {
            EntidadFormModel model = new EntidadFormModel();
            List<Entidad> lista = new List<Entidad>();

            _entidad.Objeto = new Entidad();

            if (!string.IsNullOrEmpty(Request.QueryString["buscador"]))
            {
                _entidad.Objeto.Nombre = Request.QueryString["buscador"];
            }

            model.CargarDatosPaginados(_entidad.Filtrar());

            return View(model);
        }

        public ActionResult Editar(int id)
        {
            EntidadFormModel model = new EntidadFormModel();
            model.Objeto = _entidad.Cargar(id);
            model.Paises = _pais.ObtenerTodos();
            
            if (model.Objeto.IdEntidad.HasValue)
            {
                return View(model);
            }
            else
            {
                return RedirectToAction("Listar");
            }
        }


        [HttpPost]
        public ActionResult Editar(EntidadFormModel model, int id)
        {
            if (ModelState.IsValid)
            {
                GuardarEntidad(model, id);
            }

            return View(model);
        }

        

        public ActionResult Crear()
        {
            EntidadFormModel model = new EntidadFormModel();
            model.Paises = _pais.ObtenerTodos();
            return View(model);
        }

        [HttpPost]
        public ActionResult Crear(EntidadFormModel model)
        {
            if (ModelState.IsValid)
            {
                GuardarEntidad(model, 0);
            }

            return View(model);
        }

        public ActionResult Eliminar(int id)
        {
            BaseModel model = new BaseModel();

            if (_entidad.Eliminar(id))
                model.Javascript = Scripts.RedireccionConMensaje("/Entidades/Listar", "Entidad eliminada correctamente");
            else
            {
                string mensaje = "El perfil no se pudo eliminar";

                if (_entidad.TipoError == TipoErrorSql.ReferenceConstraint)
                {
                    if (_entidad.Error.IndexOf("FK_Usuario_Entidad") > 0)
                    {
                        mensaje = "ERROR: La entidad tiene usuarios asociados.";
                    }
                    else if (_entidad.Error.IndexOf("FK_Tramite_Entidad")>0)
                    {
                        mensaje = "ERROR: La entidad tiene tramites asociados.";
                    }
                }

                model.Javascript = Scripts.RedireccionConMensaje("/Entidades/Listar", mensaje);
            }

            return View(model);
        }

        #region Metodos

        private void GuardarEntidad(EntidadFormModel model, int id)
        {
            _entidad.Objeto = model.Objeto;
            _entidad.Objeto.FechaModificacion = DateTime.Now;

            bool operacionExitosa = false;

            TipoTransaccion tipoTransaccion = TipoTransaccion.Crear;

            if (id == 0)
            {
                id = _entidad.Crear();
                _entidad.Objeto.IdEntidad = id;
                operacionExitosa = id > 0;
            }
            else
            {
                tipoTransaccion = TipoTransaccion.Editar;
                _entidad.Objeto.IdEntidad = id;
                operacionExitosa = _entidad.Editar();
            }

            if (operacionExitosa)
            {
                GuardarLogTransaccion(tipoTransaccion, model.Objeto);
                model.Javascript = Scripts.RedireccionConMensaje("/Entidades/Listar", "Perfil guardado correctamente");
            }
            else
            {
                if (_entidad.TipoError == TipoErrorSql.Unique)
                    model.Javascript = Scripts.Alert("El nombre de entidad ya existe. Intente de nuevo.");
                else
                    model.Javascript = Scripts.Alert("La entidad no se pudo guardar");
            }
        }

        #endregion

    }
}
